package org.pearl.validation.demo.mapstruct;


import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
import org.pearl.validation.demo.pojo.entity.User;
import org.pearl.validation.demo.pojo.po.UserInfoPO;

/**
 * Created by TD on 2021/6/3
 */
// 该@Mapper注解1 将接口标记为映射接口，并让 MapStruct 处理器在编译期间启动。
// 在一个接口中可以有多个映射方法，MapStruct 将为所有这些方法生成一个实现。
@Mapper
public interface CarMapper {

    // 接口声明一个成员实例，为客户端提供对映射器实现的访问
    CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);

    /**
     * 实际映射方法期望源对象作为参数并返回目标对象。它的名字可以自由选择。
     *
     * @param car 需要转换的对象
     * @return CarDto 转换后的对象 numberOfSeats
     */
    // @Mapping 标注隐射关系
    // @Mapping(source = "numberOfSeats", target = "seatCount")
    //  @ToEntity
    @Mapping(source = "driver.name", target = "driverName")
    CarDto car2CarDto(Car car, Driver driver);


    // @Mapping(source = "driver.name", target = "driverName")
    @Mapping(source = "person", target = "personDTO")
    CarDto car2CarDto(Car car);

    PersonDTO person2PersonDTO(Person person);

    // 将carDto的属性复制到car中
    void updateCarFromDto(CarDto carDto, @MappingTarget Car car);

    UserInfoPO car2CarDto(User user);


    Person map(User user);
}